package com.qidian.mes.sys.excel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.qidian.mes.pojo.User;
import com.qidian.mes.sys.service.UserService;
import com.qidian.mes.util.pojo.QdResult;
import org.apache.commons.codec.digest.DigestUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author 小可怎么都睡不够
 * @Company 起点编程
 * @Description
 * @Time 2024/4/12 11:06
 */
public class UserExcelParseListener implements ReadListener<User> {
    // ReadListener 不能被Spring管理，所以我们的属性只能通过构造方法或者setter方法手动注入
    private UserService userService;
    // 构造方法注入service属性
    public UserExcelParseListener(UserService userService) {
        this.userService = userService;
    }

    private static final int BATCH_COUNT = 5;
    // 缓存读取的数据
    private List<User> users = new ArrayList<>();
    private int count = 0; // 执行成功的数据

    public int getCount() {
        return count;
    }

    /**
     * 每次 读取一行数据都会回调此方法
     * @param data    one row value. It is same as {@link AnalysisContext#readRowHolder()}
     * @param context analysis context
     */
    @Override
    public void invoke(User data, AnalysisContext context) {
        // 处理密码，默认为123456
        data.setLoginPass(DigestUtils.md5Hex("123456".getBytes()));
        if(users.size() >= BATCH_COUNT){
            // 如果到BATCH_COUNT的时候，就保存一次
            QdResult<Integer> result = userService.saveUsers(users);
            count += result.getData();
            // 清空
            users.clear();
            return;
        }
        // 如果集合中的数据量不到BATCH_COUNT，就缓存起来
        users.add(data);
    }

    /**
     * 整个文件读取结束之后执行
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 如果集合中的数据量不到BATCH_COUNT，就保存一次
        if(users.size() > 0){
            QdResult<Integer> result = userService.saveUsers(users);
            count += result.getData();
        }
    }
}
